#!/bin/sh
# Source: https://gitlab.gnome.org/GNOME/fractal/blob/master/hooks/pre-commit.hook

install_rustfmt() {
    if ! which rustup >/dev/null 2>&1; then
        curl https://sh.rustup.rs -sSf  | sh -s -- -y
        export PATH=$PATH:$HOME/.cargo/bin
        if ! which rustup >/dev/null 2>&1; then
            echo "Failed to install rustup. Performing the commit without style checking."
            exit 0
        fi
    fi

    if ! rustup component list|grep rustfmt >/dev/null 2>&1; then
        echo "Installing rustfmt…"
        rustup component add rustfmt
    fi
}

CONFIG_FILE=./crates/rnote-ui/src/config.rs

if [ ! -f "$CONFIG_FILE" ]; then
    echo "Unable to check the project's code style, because config.rs does not exist. Please build the project in order to generate it."

    if [ ! -t 1 ]; then
        # No input is possible
        echo "Performing commit."
        exit 0
    fi

    echo ""
    echo "y: Perform the commit"
    echo "N: Abort the commit"

    echo ""
    while true
    do
        printf "%s" "Perform commit anyway? [y/N]: "; read yn < /dev/tty
        case $yn in
            [Yy]* ) echo "Performing commit."; exit 0;;
            [Nn]* | "" ) echo "Aborting commit."; exit 1 >/dev/null 2>&1;;
            * ) echo "Invalid input";;
        esac
    done

fi

if ! which cargo >/dev/null 2>&1 || ! cargo fmt --help >/dev/null 2>&1; then
    echo "Unable to check the project's code style, because rustfmt could not be run."

    if [ ! -t 1 ]; then
        # No input is possible
        echo "Performing commit."
        exit 0
    fi

    echo ""
    echo "y: Install rustfmt via rustup"
    echo "n: Don't install rustfmt and perform the commit"
    echo "Q: Don't install rustfmt and abort the commit"

    echo ""
    while true
    do
        printf "%s" "Install rustfmt via rustup? [y/n/Q]: "; read yn < /dev/tty
        case $yn in
            [Yy]* ) install_rustfmt; break;;
            [Nn]* ) echo "Performing commit."; exit 0;;
            [Qq]* | "" ) echo "Aborting commit."; exit 1 >/dev/null 2>&1;;
            * ) echo "Invalid input";;
        esac
    done

fi

echo "--Checking style--"
cargo fmt --all -- --check
if test $? != 0; then
    echo "--Checking style fail--"
    echo "Please fix the above issues, either manually or by running: cargo fmt --all"

    exit 1
else
    echo "--Checking style pass--"
fi
